# -*- coding: utf-8 -*-
##############################################################
#  功能:升级包中的.sql文件的合并                             #
#  1：需要首先对文件进行排序,可以使用pack_sort.py进行排序    #
#  2：需要首先对文件进行排序,可以手工进行排序                #
##############################################################
import pathlib,logging,os,time
from functools import reduce
from core import merge_sql
from  hundsun_config import *    
if __name__=="__main__":
    #需要输入目录，如 d:\hundsun_files\*  hundsun_files目录下包含了所有的用于升级的文件。
    while True:
        source_path=input('输入合并包的目录,[q 退出]:')
        if source_path == 'q':
            os._exit(0)
        elif pathlib.Path(source_path).exists():
            break
        else:
            print('文件路径不合法,请重新输入')
    
    #选择升级的环境,如生产环境,测试环境,全真环境等，该环境与 DICT_ENV的配置有关系
    while True:
        input_str='请输入需要的环境,['+','.join([' '+str(x[0])+'  '+x[1][0]+' ' for x in enumerate(DICT_ENV)])+'其它值 生产 q 退出]:'
        env_flag=input(input_str)
        if env_flag == 'q':
            os._exit(0)
        elif env_flag in [str(x[0]) for x in enumerate(DICT_ENV)]:
            all_user_str=reduce(lambda x,y :  x.replace(y,DICT_ENV[int(env_flag)][1]) ,[ALL_USER_STR]+list(set([z.split(':')[1] for z in ALL_USER_STR.split(';') if z ])))
            filter_user=[x+':'+ DICT_ENV[int(env_flag)][1] for x in DICT_ENV[int(env_flag)][2:] if x ]
            allow_user_str=';'.join([w for w in reduce(lambda x,y :  x.replace(y,'') ,[all_user_str]+filter_user).split(';') if w ])
            #DICT_USE={DICT_ENV[int(env_flag)][1]:'hundsun'}
            DICT_USE={x.split(':')[0]:'hundsun' for x in allow_user_str.strip().split(';') if len(x)}
            EXT_USE=DICT_ENV[int(env_flag)][2:]
            break
        elif env_flag == '':
            print('输入不能为空')
        else:
            all_user_str=ALL_USER_STR
            allow_user_str=ALL_USER_STR
            DICT_USE=DICT_USE
            EXT_USE=tuple()
            break
            
    outfile_flag=pathlib.Path(source_path).parts[-1]
    dest_path =  str(pathlib.Path(DEST_DIR_NAME).joinpath(pathlib.Path(source_path).parts[-1]))
    os.linesep='\n'
    #设置日志名称
    logging_file = 'combine_'+time.strftime('%Y-%m-%d', time.localtime())+'.log'
    logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',datefmt='%a, %d %b %Y %H:%M:%S',filename=logging_file,filemode="w")
    #################################################################################################
    #定义一个StreamHandler，将INFO级别或更高的日志信息打印到标准错误，并将其添加到当前的日志处理对象#
    console = logging.StreamHandler()
    console.setLevel(logging.INFO)
    formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
    console.setFormatter(formatter)
    logging.getLogger('').addHandler(console)
    #################################################################################################
    #初始化实例，获得相关的数据信息
    ins_name = merge_sql(source_path,dest_path,all_user_str,allow_user_str,logging_file,outfile_flag)
    #检查否存在未解压的文件
    checkzip_result = ins_name.checkzipfile()
    if IF_CHECK_ZIP:
        if checkzip_result:
            #print(checkzip_result)
            logging.warn('存在压缩包的目录有：  '+os.linesep+os.linesep.join(checkzip_result))
            logging.warn('有压缩文件，请解压后再执行')
            os._exit(1)
    #移动sql文件到目标路径
    ins_name.move_file()
    #写开始内容
    ins_name.write_result_begin()
    #写batch内容
    ins_name.write_result_content()
    #写结束内容
    ins_name.write_result_end()
    #写入plb处理文件
    ins_name.write_plb_file(DICT_USE)
    #检查dblink
    ins_name.check_dblink()
    #检查是否存在需要输入变量的文件
    ins_name.check_input_arg()
    #检查oracle10的文件
    ins_name.check_oracle10g()
    #检查是否有屏蔽的用户
    ins_name.check_extuser(EXT_USE)
    #屏蔽oracle10g的sql语句
    #如果不想屏蔽掉oracle10g的文件,可以将如下命令注释掉
    ins_name.remove_oracle10g()
    #修改文件的密码 只有是生产环境才会进行密码修改。
    #if env_flag not in [str(x) for x in range(len(DICT_ENV))]:
    ins_name.change_passwd(DICT_USE)
    #修改特殊的文件
    ins_name.change_special_sqlfile(DICT_USE)
    #删除重复的脚本
    ins_name.delete_dup_sqlfile()
    #显示其他信息：
    ins_name.showinfo()
    #移动日志文件
    ins_name.move_loggingfile()
    print('输出路径为:',dest_path)